home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Dialogs / DialogIntSliders.Mod (.txt) < prev    next >
Oberon Text  |  1995-06-30  |  7KB  |  150 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 3 Feb 95
  6. Syntax10b.Scn.Fnt
  7. ParcElems
  8. Alloc
  9. MODULE DialogIntSliders;
  10.     (** Markus Knasm
  11. ller 31 Aug 94 - 
  12.     IMPORT DialogFrames, Dialogs, DialogSliders, DialogTexts, Display, Fonts, GraphicUtils, In, Oberon, TextFrames, Texts, Viewers;
  13.     CONST backCol = DialogSliders.backCol; patternCol = backCol; W* = 70; H* = 20; MM = 1; ML = 0; MR =2;
  14.     TYPE
  15.         Item* = POINTER TO ItemDesc;
  16.         ItemDesc* = RECORD (DialogSliders.ItemDesc)
  17.             maxValue*: INTEGER (* highest possible value of sliderdY *)
  18.         END;
  19.         minusArrow*, plusArrow*: Display.Pattern;
  20.         minusArrowImage, plusArrowImage: ARRAY 10 OF SET;
  21.         fnt: Fonts.Font;
  22.     PROCEDURE Max (x, y: INTEGER): INTEGER;
  23.     BEGIN IF x > y THEN RETURN x ELSE RETURN y END
  24.     END Max;
  25.     PROCEDURE Min (x, y: INTEGER): INTEGER;
  26.     BEGIN IF x < y THEN RETURN x ELSE RETURN y END
  27.     END Min;
  28.     PROCEDURE (s: Item) Init*;
  29.     (** initialies the object, should be called after allocating the object with NEW *)
  30.     BEGIN s.Init^; s.maxValue := MAX (INTEGER)
  31.     END Init;
  32.     PROCEDURE (s: Item) Copy* (VAR dup: Dialogs.Object);
  33.     (** allocates dup and makes a deep copy of o. Before calling this methode dup should be equal NIL *)
  34.         VAR x: Item; 
  35.     BEGIN IF dup = NIL THEN NEW (x); dup := x ELSE x := dup(Item) END; s.Copy^ (dup); 
  36.     END Copy;
  37.     PROCEDURE (s: Item) MaxValue* (): INTEGER;
  38.     (** returns the highest possible value of sliderdY *)
  39.     BEGIN RETURN s.maxValue
  40.     END MaxValue;
  41.     PROCEDURE IntToChar (x0: INTEGER; VAR a: ARRAY OF CHAR);
  42.         VAR i, j: INTEGER; b: ARRAY 11 OF CHAR;
  43.     BEGIN 
  44.         i := 0; x0 := Max (0, x0);
  45.         REPEAT
  46.             b[i] := CHR(x0 MOD 10 + 30H); x0 := x0 DIV 10; INC(i)
  47.         UNTIL x0 = 0;
  48.         FOR j := 0 TO i - 1 DO
  49.             a[j] := b[i -1 - j]
  50.         END;
  51.         a[i] := 0X
  52.     END IntToChar;
  53.     PROCEDURE (s: Item) Arrow* (down: BOOLEAN): Display.Pattern;
  54.     BEGIN
  55.         IF down THEN RETURN (minusArrow) ELSE RETURN (plusArrow) END
  56.     END Arrow;
  57.     PROCEDURE (s: Item) DrawSlider* (f: Display.Frame; pressed : BOOLEAN; x, y, w, h, mode : INTEGER);
  58.     (** displays the slider of the item at (x, y) in frame f *)
  59.         VAR dummy: INTEGER; arr: ARRAY 11 OF CHAR; bgPat: Display.Pattern;
  60.     BEGIN
  61.         Display.ReplConstC (f, backCol, x, y , w, h, Display.replace); IntToChar (s.sliderdY, arr); 
  62.         IF h > w THEN bgPat := DialogSliders.vBgPat ELSE bgPat := DialogSliders.hBgPat END;
  63.         Display.ReplPatternC (f, patternCol, bgPat, x, y, w, h, 0, 0, mode);
  64.         y := y + (h DIV 2) - (fnt.maxY DIV 2);
  65.         GraphicUtils.DrawString (f, arr, x, y, w, fnt, mode, GraphicUtils.center, dummy) 
  66.     END DrawSlider;
  67.     PROCEDURE (s: Item) MoveSlider* (f: Display.Frame; pressed: BOOLEAN; dY: INTEGER);
  68.     (** changes the displayed value to dY *)
  69.         VAR dummy, x, y, w, h: INTEGER; arr: ARRAY 11 OF CHAR; bgPat: Display.Pattern;
  70.     BEGIN
  71.         s.GetDim (x, y, w, h); x := x + f.X; y := y + f.Y + f.H;
  72.         IF w > h THEN x := x + h; w := w - 2 * h ELSE y := y + w; h := h - 2 * w END;
  73.         Display.ReplConstC (f, backCol, x, y , w, h, Display.replace); IntToChar (dY, arr); 
  74.         IF h > w THEN bgPat := DialogSliders.vBgPat ELSE bgPat := DialogSliders.hBgPat END;
  75.         Display.ReplPatternC (f, patternCol, bgPat, x, y, w, h, 0, 0, Display.paint);
  76.         y := y + (h DIV 2) - (fnt.maxY DIV 2);
  77.         GraphicUtils.DrawString (f, arr, x, y, w, fnt, Display.paint, GraphicUtils.center, dummy) 
  78.     END MoveSlider;
  79.     PROCEDURE (s: Item) PrintSlider* (x, y, w, h: INTEGER);
  80.     (** prints the slider of the item at printer coordinates (x, y) *)
  81.         VAR dummy: INTEGER; arr: ARRAY 11 OF CHAR;
  82.     BEGIN
  83.         GraphicUtils.PrintBox (x, y, w,h); IntToChar (s.sliderdY, arr); 
  84.         y := y + (h DIV 2) - (SHORT (fnt.maxY * Dialogs.dUnit DIV Dialogs.pUnit) DIV 2);
  85.         GraphicUtils.PrintString (arr, x, y, w, fnt, GraphicUtils.center, dummy) 
  86.     END PrintSlider;
  87.     PROCEDURE (s: Item) CheckdY* (VAR dY: INTEGER);
  88.     (** checks whether dY is a possible value for sliderdY *)
  89.     BEGIN dY := Max (0, dY)
  90.     END CheckdY;
  91.     PROCEDURE (s: Item) TrackScrollBar* (f: Display.Frame; mx, my : INTEGER; keys : SET);
  92.     (** handles mouse events concerning the full scrollbar *)    
  93.         VAR x, y, w, h : INTEGER; t1: Texts.Text; olddY: INTEGER;
  94.     BEGIN
  95.         s.GetDim (x, y, w, h); x := x + f.X; y := y + f.Y + f.H; olddY:= s.sliderdY;
  96.         IF ((keys = {MM}) OR (keys = {ML}) OR (keys = {MR})) & (Max (w, h) >= 2 * Min (w, h)) THEN    
  97.             Oberon.RemoveMarks (x, y, w, h);
  98.             IF w > h THEN
  99.                 IF mx < x + h THEN s.TrackButton (f, x, y, h, mx, my, keys, TRUE)
  100.                 ELSIF mx >= x + w - h THEN s.TrackButton (f, x + w - h, y, h, mx, my, keys, FALSE)
  101.                 END 
  102.             ELSE
  103.                 IF my < y + w THEN s.TrackButton (f, x, y, w, mx, my, keys, TRUE)
  104.                 ELSIF my >= y + h - w THEN s.TrackButton (f, x, y + h - w, w, mx, my, keys, FALSE)
  105.                 END
  106.             END;
  107.             IF ((keys = {MM}) OR (keys = {ML}) OR (keys = {MR})) & (s.cmd[0] # 0X) & (olddY # s.sliderdY) THEN
  108.                 DialogTexts.GetParText (s.par, s.panel, t1);
  109.                 s.CallCmd (f, Viewers.This (x,y), t1)
  110.             END
  111.         END
  112.     END TrackScrollBar;
  113.     PROCEDURE Insert*;
  114.     (** Insert ([name] [x y w h] | ^ ) inserts a integerslider - item in the panel containing the caret position *)
  115.         VAR x, y, x1, y1, w, h: INTEGER; p : Dialogs.Panel; s: Item; name: ARRAY 64 OF CHAR;
  116.     BEGIN
  117.         NEW (s); 
  118.         DialogFrames.GetCaretPosition (p, x, y);
  119.         IF (p # NIL) THEN
  120.             s.Init; In.Open; In.Name (name);
  121.             IF ~In.Done THEN COPY ("", name); In.Open END;
  122.             s.SetName (name); 
  123.             In.Int (x1); In.Int (y1); In.Int (w); In.Int (h);
  124.             IF ~In.Done THEN x1 := x; y1 := y; w := W; h := H 
  125.             ELSE
  126.                 IF w < 0 THEN w := W END;
  127.                 IF h < 0 THEN h := H END
  128.             END;
  129.             s.SetDim (x1, y1, w, h, FALSE); p.Insert (s, FALSE)
  130.         ELSE
  131.             Dialogs.res := Dialogs.noPanelSelected
  132.         END;
  133.         IF Dialogs.res # 0 THEN Dialogs.Error ("DialogIntSliders") END;
  134.     END Insert;
  135. BEGIN
  136.     minusArrowImage[0] := {};    plusArrowImage[0] := {};
  137.     minusArrowImage[1] := {};    plusArrowImage[1] := {3..5};
  138.     minusArrowImage[2] := {};    plusArrowImage[2] := {3..5};
  139.     minusArrowImage[3] := {};    plusArrowImage[3] := {3..5};
  140.     minusArrowImage[4] := {0..8};    plusArrowImage[4] := {0..8};
  141.     minusArrowImage[5] := {0..8};    plusArrowImage[5] := {0..8};
  142.     minusArrowImage[6] := {0..8};    plusArrowImage[6] := {0..8};
  143.     minusArrowImage[7] := {};    plusArrowImage[7] := {3..5};
  144.     minusArrowImage[8] := {};    plusArrowImage[8] := {3..5};
  145.     minusArrowImage[9] := {};    plusArrowImage[9] := {3..5};
  146.     minusArrow := Display.NewPattern (minusArrowImage, 9, 9);
  147.     plusArrow := Display.NewPattern (plusArrowImage, 9, 9);
  148.     fnt := Fonts.This ("Syntax10.Scn.Fnt")
  149. END DialogIntSliders.
  150.